#include "lista.h"
#include <pthread.h>


void lista_init(tLista* l){
	l->Actual=NULL;
	l->Primero=NULL;
	l->Ultimo=NULL;
	l->length=0;
	pthread_mutex_init(&l->sem,NULL);
}
void lista_push(tLista* l, Pedido* p){

	tNodo* new= (tNodo* ) malloc(sizeof(tNodo));
	//para refrescar la memoria??
	//tNodo* new= (tNodo* ) malloc(512);

	new->Dato=p;

	//pthread_mutex_init(&new->Dato.s_del, NULL);

pthread_mutex_lock(&l->sem);
//wait(s)
	if (l->Primero==NULL){
		new->Ant=NULL;
		new->Sig=NULL;

		l->Primero=new;
		l->Actual=new;
		l->Ultimo=new;
	}else{
		tNodo* aux= l->Ultimo;
		//aux->Ant=
		aux->Sig=new;
        new->Ant=aux;
		new->Sig=NULL;

		//l->Primero=new;
		l->Actual=new;
		l->Ultimo=new;
	}
	l->length++;
//signal(s)
pthread_mutex_unlock(&l->sem);

}

Pedido* lista_popNodo(tLista* l, tNodo* n){
//wait(s)
pthread_mutex_lock(&l->sem);
	tNodo* a=n->Ant;
	tNodo* s=n->Sig;
	if ((a!=NULL) && (s!=NULL)){
		a->Sig=s;
		s->Ant=a;
	}
	if (a==NULL){//primero
	  	l->Primero=s;
	  	if (s!=NULL)
	  		s->Ant=NULL;
	}
	if (s==NULL){//ultimo
		l->Ultimo=a;
		if (a!=NULL)
			a->Sig=NULL;
	}


	l->length--;

	//if (n->Dato.Tipo==1){
	/*
	if (n->Dato.Info!=NULL){
		free(n->Dato.Info);
		n->Dato.Info=NULL;
	}
	*/

	//pthread_mutex_unlock(&n->Dato.s_del);
	//pthread_mutex_destroy(&n->Dato.s_del);
	Pedido* dato=n->Dato;
	free(n);
	n=NULL;

//signal(s)
pthread_mutex_unlock(&l->sem);
	return dato;
}

tNodo* lista_getfirst(tLista* l){
	pthread_mutex_lock(&l->sem);
	tNodo* r=l->Primero;
	pthread_mutex_unlock(&l->sem);
	return r;
}

tNodo* lista_getLast(tLista* l){
	pthread_mutex_lock(&l->sem);
	tNodo* r=l->Ultimo;
	pthread_mutex_unlock(&l->sem);
	return r;
}

tNodo* lista_getNext(tLista* l, tNodo* n){
	pthread_mutex_lock(&l->sem);
	tNodo* r=n->Sig;
	pthread_mutex_unlock(&l->sem);
	return r;
}
